package com.tanhua.server.service;

import com.tanhua.domain.db.UserInfo;
import com.tanhua.domain.mongo.Comment;
import com.tanhua.domain.mongo.Publish;
import com.tanhua.domain.vo.CommentVo;
import com.tanhua.domain.vo.MovementsVo;
import com.tanhua.domain.vo.PageResult;
import com.tanhua.dubbo.api.UserInfoApi;
import com.tanhua.dubbo.api.mongo.CommentApi;
import com.tanhua.dubbo.api.mongo.PublishApi;
import com.tanhua.server.interceptor.UserHolder;
import org.apache.dubbo.config.annotation.Reference;
import org.bson.types.ObjectId;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

@Service
public class CommentService {

    @Reference
    private CommentApi commentApi;
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    @Reference
    private PublishApi publishApi;
    @Autowired
    private MovementsService movementsService;
    @Reference
    private UserInfoApi userInfoApi;

    /**
     * 接口名称：动态-点赞
     * 需求描述：往quanzi_comment评论表插入数据并更新动态表中点赞数量，且返回总点赞数
     */
    public ResponseEntity<Object> likeComment(String publishId) {
        Long count = this.saveComment(publishId,1);
        // 4. 记录对这个动态的点赞标记到redis中；然后就可以在查询返回动态时候进行判断是否有对动态点赞；前端点亮图标
        redisTemplate.opsForValue().set("public_like_comment_" + UserHolder.getUserId() + "_" + publishId, "1");

        // 5.返回点赞总数
        return ResponseEntity.ok(count.intValue());
    }

    /**
     * 接口名称：动态-取消点赞
     * 接口路径：GET/movements/:id/dislike
     * 需求分析：删除评论表中点赞数据、修改动态表点赞总数减1、返回点赞数量
     */
    public ResponseEntity<Object> disLikeComment(String publishId) {
        //0. 获取登陆用户、操作的用户
        Long userId = UserHolder.getUserId();
        //1. 创建评论对象
        Comment comment = new Comment();
        comment.setUserId(userId);//哪一个用户
        comment.setPublishId(new ObjectId(publishId));//对哪一个动态
        comment.setCommentType(1);//点赞操作
        //2. 删除当前用户的点赞记录
        Long count = commentApi.delete(comment);
        //3. 删除redis中的用户对动态的点赞标记
        redisTemplate.delete("public_like_comment_" + userId + "_" + publishId);

        return ResponseEntity.ok(count.intValue());
    }

    public ResponseEntity<Object> loveComment(String publishId) {
        // 3.喜欢(保存)
        Long count = this.saveComment(publishId,3);
        // 4. 记录对这个动态的喜欢标记到redis中；然后就可以在查询返回动态时候进行判断是否有对动态点赞；前端点亮图标
        redisTemplate.opsForValue().set("public_love_comment_" + UserHolder.getUserId() + "_" + publishId, "1");

        // 5.返回点赞总数
        return ResponseEntity.ok(count.intValue());
    }

    /**
     * 接口名称：动态-取消喜欢
     * 接口路径：GET/movements/:id/unlove
     * 需求描述：删除评论数据、修改动态表、返回喜欢总数
     */
    public ResponseEntity<Object> unloveComment(String publishId) {
        //0. 获取登陆用户、操作的用户
        Long userId = UserHolder.getUserId();
        //1. 创建评论对象
        Comment comment = new Comment();
        comment.setUserId(userId);//哪一个用户
        comment.setPublishId(new ObjectId(publishId));//对哪一个动态
        comment.setCommentType(3);
        //2. 删除当前用户的喜欢记录
        Long count = commentApi.delete(comment);
        //3. 删除redis中的用户对动态的喜欢标记
        redisTemplate.delete("public_love_comment_" + userId + "_" + publishId);

        return ResponseEntity.ok(count.intValue());
    }

    /**
     * 接口名称：单条动态
     * 需求分析：根据动态id查询，并返回MovementsVo对象
     */
    public ResponseEntity<Object> queryMovementsById(String publishId) {
        //1. 根据动态id查询
        Publish publish = publishApi.findById(publishId);
        //2. 创建vo对象并封装
        MovementsVo vo = new MovementsVo();
        //3. 把publish转换为movementsVo对象
        movementsService.convertPublishToMovements(publish, vo);
        //4. 把封装好的vo对象返回
        return ResponseEntity.ok(vo);
    }

    /**
     * 接口名称：评论列表
     * 接口路径：GET/comments
     * 需求描述：分页查询评论，查询条件：动态id、评论类型
     */
    public ResponseEntity<Object> commentsList(
            String movementId, Integer page, Integer pagesize) {
        //1. 分页查询评论
        PageResult pageResult = commentApi.findByPage(movementId, page, pagesize);
        //2. 获取评论数据
        List<Comment> list = (List<Comment>) pageResult.getItems();
        //3. 定义返回的vo集合
        List<CommentVo> voList = new ArrayList<>();
        //4. 封装数据 list--->voList
        if (!CollectionUtils.isEmpty(list)) {
            for (Comment comment : list) {
                CommentVo vo = new CommentVo();
                vo.setId(comment.getId().toString());
                // 根据用户id查询
                UserInfo userInfo = userInfoApi.findById(comment.getUserId());
                vo.setAvatar(userInfo.getAvatar());
                vo.setNickname(userInfo.getNickname());
                vo.setContent(comment.getContent());
                vo.setCreateDate(new DateTime(comment.getCreated()).toString("yyyy年MM月dd日 HH:mm"));
                vo.setLikeCount(0);
                vo.setHasLiked(0);

                voList.add(vo);
            }
        }
        //5. 设置到分页对象中
        pageResult.setItems(voList);
        return ResponseEntity.ok(pageResult);
    }

    /**
     * 接口名称：评论-提交
     * 接口路径：POST/comments
     */
    public ResponseEntity<Object> saveComments(String movementId, String content) {
        this.saveComment(movementId,2,content);
        return ResponseEntity.ok(null);
    }

    /**
     * 抽取公用方法：保存点赞、喜欢、评论
     * @return 返回点赞、喜欢、评论总数
     */
    public Long saveComment(String publishId,int commentType,String... content) {
        // 1.获取登陆用户id
        Long userId = UserHolder.getUserId();
        // 2.创建评论对象
        Comment comment = new Comment();
        comment.setPublishId(new ObjectId(publishId));
        //评论类型，1-点赞，2-评论，3-喜欢
        comment.setCommentType(commentType);
        //论内容类型： 1-对动态操作
        comment.setPubType(1);
        comment.setUserId(userId);
        comment.setCreated(System.currentTimeMillis());
        if (content != null && content.length>0) {
            String key="Freeze_Id_"+userId+"_Type_2";
            if(redisTemplate.hasKey(key)){
                return 0l;
            }
            comment.setContent(content[0]);
        }

        // 3.点赞(保存)
        Long count = commentApi.save(comment);
        return count;
    }

}


